package com.cskaoyan.basic;

/*
      线程的第二种实现方式
        1.定义实现Runnable接口的子类
        2.实现Runnable接口的run方法
        3.创建该子类对象
        4.在创建Thread对象的时候，将创建好的Runnable子类对象作为初始化参数，传递给Thread对象
        5.启动Thread对象(启动线程)


    注意事项：
    1. 我们Runnable接口子类的run()方法代码，会运行在子线程当中。

    2. 所以，在线程的第二种实现方式中，我们自己定义子类，实现Runnable接口的run方法，
       将要在子线程中执行的代码，方法run()方法中

    3. 但是，Runnable子类对象，并不代表线程，它只代表，要在线程中执行的任务。

    我们认为，从逻辑上说，第二种方法逻辑十分清晰：
    1. 线程就是一条执行路径，至于在线程这条执行路径上，究竟执行的是什么样的具体代码，
       应该和线程本身没有关系的
    2. 也就是说，线程，和在线程(执行路径)上执行的任务应该是没有什么直接关系的
    3. 线程实现的第二种方式，把线程(Thread对象代表线程) 和在 线程上执行的任务(Ruannable子类对象)分开
 */
public class Demo3SecondType {

    public static void main(String[] args) {
        // 3.创建Runnable接口的子类对象
        // 表示的是在线程中执行的任务
        MyRunnable myRunnable = new MyRunnable();

        // 4.创建Thread对象(表示线程)
        Thread thread = new Thread(myRunnable);

        // 5. 启动线程
        thread.start();

    }
}

// 1. 定义Runnable接口子类
class MyRunnable implements Runnable {

    // 2. 覆盖接口中的方法, 该方法也会运行在线程中
    @Override
    public void run() {
        System.out.println("hello, thread");
    }
}
